# 迭代器：未知长度数据流，关键字iter(),通过next获取下一个元素，强调数据传输。
# 生成器：提供惰性延迟功能的特殊迭代器，在函数中使用关键字yeild()，强调指令执行。

# 局部变量——>全局变量
a = "a"


def foo_1():
    global a
    a = 'b'
    return None


# 局部变量——>自由变量
def foo_2():
    c = 'c'

    def foo_2_1():
        nonlocal c  # 换成global不管用
        c = 'd'
        return c

    return c, foo_2_1(), c


if __name__ == '__main__':
    print(a)  # a调用函数前
    foo_1()  # 调用函数
    print(a)  # a调用函数后

    print(foo_2())  # 调用函数前/中/后

# 装饰器

cache = {}


def cache_deco(func,*args):
    if args in cache:
        return cache[args]

    def deco(*args):
        result = func(*args)
        add_1 = {args[0]: result}
        cache.update(add_1)
        return result

    return deco


@cache_deco
def fibo(n):
    if n < 0:
        return None
    if n < 2:
        return n
    return fibo(n - 1) + fibo(n - 2)


# fibo=cache_deco(fibo)
print(fibo(10))
print(cache)

